/*
Problem Description
有一群人，打乒乓球比赛，两两捉对撕杀，每两个人之间最多打一场比赛。
球赛的规则如下：
如果A打败了B，B又打败了C，而A与C之间没有进行过比赛，那么就认定，A一定能打败C。
如果A打败了B，B又打败了C，而且，C又打败了A，那么A、B、C三者都不可能成为冠军。
根据这个规则，无需循环较量，或许就能确定冠军。你的任务就是面对一群比赛选手，在经过了若干场撕杀之后，确定是否已经实际上产生了冠军。
 

Input
输入含有一些选手群，每群选手都以一个整数n(n<1000)开头，后跟n对选手的比赛结果，比赛结果以一对选手名字（中间隔一空格）表示，
前者战胜后者。如果n为0，则表示输入结束。
 

Output
对于每个选手群，若你判断出产生了冠军，则在一行中输出“Yes”，否则在一行中输出“No”。
 

Sample Input
3
Alice Bob
Smith John
Alice Smith
5
a c
c d
d e
b e
a d
0
 

Sample Output
Yes
No
 */
package com.yuan.algorithms.training20150807;

import java.util.HashMap;
import java.util.Scanner;

/**
 * @author YouYuan
 * @eMail E-mail:1265161633@qq.com
 * @Time 创建时间：2015年8月11日 下午3:51:12
 * @Explain 说明:因为只要确定是否产生冠军，根据题意可以得知当且仅当入度为0的只有一个时可以产生冠军，可以用map来映射存储的人的名字
 */
public class 产生冠军 {

	static Scanner in = new Scanner(System.in);
	static HashMap<String, Integer> map = new HashMap<String, Integer>();//用于映射每个队员对应的度的数组的下标
	public static void main(String[] args) {
		while(in.hasNext()) {
			int n = in.nextInt();
			if (n==0) {
				break;
			}
			map.clear();
			int[] degree = new int[n<<1];//存储每个队员的入度
			int k = -1;//度的下标
			for (int i = 0; i <n; i++) {
				String a = in.next();
				String b = in.next();
				if (map.get(a)==null) {//判断是否是新队员
					map.put(a, ++k);//添加映射
					degree[k] = 0;//设置度为0
				}
				if (map.get(b)==null) {
					map.put(b, ++k);
					degree[k] = 1;
				} else {
					int temp = map.get(b);
					degree[temp]++;
				}
			}
			int sum = 0;
			for (int i = 0; i <= k; i++) {
				if (degree[i] == 0) {
					sum++;
				}
			}
			System.out.println(sum == 1 ? "Yes" : "No");
		}
	}

}
